class Singleton { // 饿汉式
    private static Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }

    public void showMessage(){
        System.out.println("Hello World!");
    }
}
// public class Singleton { // 懒汉式 线程不安全
//     private static Singleton instance;

//     private Singleton() {}

//     public static Singleton getInstance() {
//         if ( instance == null ) instance = new Singleton();

//         return instance;
//     }
// }
// public class Singleton { // 懒汉式 线程安全
//     private static Singleton instance;

//     private Singleton() {}

//     public static synchronized Singleton getInstance() {
//         if ( instance == null ) instance = new Singleton();

//         return instance;
//     }
// }
// public class Singleton { // 双检锁/双重校验锁
//     private volatile static Singleton singleton; // volatile 不会因编译器的优化而省略

//     private Singleton() {}

//     public static Singleton getSingleton() {
//         if ( singleton == null ) {
//             synchronized (Singleton.class) {
//                 if ( singleton == null ) singleton = new Singleton();
//             }
//         }

//         return singleton;
//     }
// }
// public class Singleton { // 登记式/静态内部类
//     private static class SingletonHolder {
//         private static final Singleton INSTANCE = new Singleton();
//     }

//     private Singleton() {}

//     public static final Singleton getInstance() {
//         return SingletonHolder.INSTANCE;
//     }
// }
// public enum Singleton { // 枚举
//     INSTANCE;

//     public void whateverMethod() {
//     }
// }

public class SingletonDemo {
    public static void main(String[] args) {
        Singleton object = Singleton.getInstance();

        object.showMessage();
    }
}
